﻿/*
file js quản lý người dùng
*/
$(document).ready(function () {
    if (typeof (VOFFICE) == "undefined") {
        // ReSharper disable AssignToImplicitGlobalInFunctionScope
        VOFFICE = {};
        // ReSharper restore AssignToImplicitGlobalInFunctionScope
    }

    VOFFICE.ManageUser = (function () {
        var methods = {};

        methods.PageSize = 10;
        methods.UserGrid = null;
        methods.UserForm = null;
        methods.AsignGrid = null;
        methods.GenderList = null;
        methods.Collection = null;
        methods.RoleName = '';
        methods.CustomValidate = {
            errorLabelContainer: "#user-form-error",
            rules: {
                UserName: { required: true },
                FullName: { required: true },
                Password: { required: true, minlength: 6 },
                ConfirmPassword: { equalTo: '#Password' },
                Email: { required: true, email: true }
            },
            messages: {
                UserName: { required: jsResources.lang.ManageUserUserNameRequired },
                FullName: { required: jsResources.lang.ManageUserFullNameRequired },
                Email: { required: jsResources.lang.ManageUserEmailRequired, email: jsResources.lang.ManageUserEmailFormat },
                Password: { required: jsResources.lang.ManageUserPasswordRequired, minlength: jsResources.lang.ManageUserPasswordMinLength },
                ConfirmPassword: { equalTo: jsResources.lang.ManageUserPasswordConfirmIncorrect }
            }
        };
        methods.CustomValidateUpdate = {
            errorLabelContainer: "#user-form-error",
            rules: {
                UserName: { required: true },
                FullName: { required: true },
                Email: { required: true, email: true }
            },
            messages: {
                UserName: { required: jsResources.lang.ManageUserUserNameRequired },
                FullName: { required: jsResources.lang.ManageUserFullNameRequired },
                Email: { required: jsResources.lang.ManageUserEmailRequired, email: jsResources.lang.ManageUserEmailFormat }
            }
        };
        var $table = $('#list-details');
        var $pager = $('#pager');
        methods.dialog = $('#dialog-box').dialog({
            autoOpen: false,
            show: "fade", //fix ie bug
            hide: "fade",
            modal: true,
            height: 'auto',
            width: 600,
            open: function (event, ui) {
                //$('.ui-dialog-titlebar', ui.dialog || ui).hide();
            },
            close: function (event, ui) {
            }
        });

        var $buttonSearch = $('#btn-search');
        var $key = $('#ipt-search');
        methods.busy = false;

        /*
        Thực hiện tìm kiếm 
        Với số lượng bản ghi không lớn, sẽ không phân trang kết quả tìm kiếm
        $pager.fadeOut("fast");
        */
        var search = function (event) {
            if (!!$key.val()) {
                if (!methods.busy) {
                    methods.busy = true;
                    $pager.fadeOut("fast");
                    $.get('/users/search_user', { key: $key.val(), nocache: (new Date()).toJSON() }, function (data) {
                        methods.busy = false;
                        if (!!data && data.Status == true) {
                            VH.DateUtility.FixDates(data);

                            var list = new UserCollection();
                            if (data.Result.List.length > 0) {
                                _.each(data.Result, function (item) {
                                    var user = new User({
                                        'UserId': item.UserName,
                                        'UserName': item.UserName,
                                        'RoleName': item.RoleName,
                                        'RoleDisplayName': item.RoleDisplayName,
                                        'FullName': item.FullName,
                                        'Email': item.Email,
                                        'Gender': item.Gender,
                                        'Mobile': item.Mobile,
                                        'Telephone': item.Telephone,
                                        'Address': item.Address,
                                        'IsApproved': item.IsApproved
                                    });
                                    list.push(user);
                                });
                                $table.find('tbody').remove();
                                methods.Collection = list;
                                methods.UserGrid = new UserGrid({ collection: list });
                                $table.append(methods.UserGrid.render().el);
                            } else {
                                alert(jsResources.lang.ManageUserNoItem);
                            }
                        }
                    });
                }
            } else {
                //$key.focus();
                getPagedUser(1);
            }
        };
        /*
        Lấy hết sổ văn bản theo phân trang
        */
        var getPagedUser = function (pageIndex) {
            pageIndex = parseFloat(pageIndex) - 1;
            //lấy dữ liệu
            SaveIndicator.indicate($.get('/users/get_all_users', { 'roleName': methods.RoleName, 'pageIndex': pageIndex, 'pageSize': methods.PageSize, nocache: (new Date()).toJSON() }, function (data) {
                if (!!data && data.Status == true) {
                    if (!!data.Result.List) {
                        VH.DateUtility.FixDates(data);
                        $table.find('tbody').remove();
                        var list = new UserCollection();
                        if (data.Result.List.length > 0) {
                            _.each(data.Result.List, function (item) {
                                var user = new User({
                                    'UserId': item.UserName,
                                    'UserName': item.UserName,
                                    'RoleName': item.RoleName,
                                    'RoleDisplayName': item.RoleDisplayName,
                                    'FullName': item.FullName,
                                    'Email': item.Email,
                                    'Gender': item.Gender,
                                    'Mobile': item.Mobile,
                                    'Telephone': item.Telephone,
                                    'Password': item.Password,
                                    'Address': item.Address,
                                    'IsApproved': item.IsApproved
                                });
                                list.push(user);
                            });
                            $table.fadeIn();
                        }
                        methods.Collection = list;
                        methods.UserGrid = new UserGrid({ collection: list });
                        $table.append(methods.UserGrid.render().el);
                        $("input:button", '#admin-page-func').button();
                        //phân trang
                        paging(1 + data.Result.PageIndex, data.Result.PageCount);
                    } else {

                    }
                }
            }));
        };
        /*
        Hiển thị dialog để thêm sổ mới
        */
        var addNew = function () {
            var addView = new UserForm({ model: new User() });
            addView.render();
        };
        /*
        Hiển thị form để sửa một sổ đã tạo
        */
        methods.edit = function (model) {
            var editView = new UserForm({ model: model });
            editView.render();
        };

        methods.assignrole = function (model) {
            SaveIndicator.indicate($.get('/users/get_roles', { 'userName': model.get('UserName') }, function (data) {
                if (!!data && data.Status == true) {
                    if (!!data.Result) {

                        VH.DateUtility.FixDates(data);
                        var list = new UserInRoleCollection();
                        if (data.Result.length > 0) {
                            _.each(data.Result, function (item) {
                                var user = new UserInRole({
                                    'UserName': item.UserName,
                                    'RoleName': item.RoleName,
                                    'RoleDisplayName': '',
                                    'IsInRole': item.IsInRole
                                });
                                list.push(user);
                            });
                        }
                        methods.AsignGrid = new AsignGrid({ collection: list });
                        methods.dialog.html(methods.AsignGrid.render().el);
                        methods.dialog.dialog('option', 'title', jsResources.lang.ManageUserAssignRole);
                        var dialogCloseButtons = jsResources.lang.ButtonClose;
                        var dialogButtons = {};
                        dialogButtons[dialogCloseButtons] = function () { $(this).dialog('close'); };
                        methods.dialog.dialog(
                            {
                                buttons: dialogButtons
                            }
                        );
                        methods.dialog.dialog('open');
                    } else {

                    }
                }
            }));
        };
        /*
        Hàm cập nhập dữ liệu trên trang sau khi save
        */
        methods.updateGrid = function (model, isNew) {
            $table.fadeIn("fast");
            if (isNew) {
                methods.Collection.add(model, { at: 0 });
            }
            methods.dialog.dialog('close');
        };

        /*
        Đóng dialog
        */
        methods.closeDialog = function () {
            methods.dialog.dialog('close');
        };

        /*
        gọi lại hàm validate form sau khi nó bị backbone render lại
        */
        methods.recallValidate = function () {
            $('#user-form').validate(methods.CustomValidate);
        };

        methods.buildJsTree = function () {
            $('#roleTree').jstree({
                json_data: {
                    "ajax": {
                        "url": "/users/get_role_list/?nocache=" + (new Date()).toJSON(),
                        "type": "POST",
                        "dataType": "json",
                        "contentType": "application/json charset=utf-8"
                    }
                },
                plugins: ["themes", "json_data", "ui"]
            });
            $('#roleTree').bind("loaded.jstree", function (event, data) {
                $('#roleTree').jstree("open_all");
            });
            $("#roleTree").bind("select_node.jstree", function (event, data) {
                var selectedObj = data.rslt.obj;
                methods.RoleName = selectedObj.attr('id');
                getPagedUser(1);
            });
        };
        /* lay cac gia tri key - value de dua vao form tao va sua
        load lén lút
        */
        var getKeyValue = function () {
            methods.GenderList = [{ Key: true, Value: jsResources.lang.Male }, { Key: false, Value: jsResources.lang.Female}];
        };

        /*
        Tạo phân trang
        */
        var paging = function (currentPage, pageCount) {
            if (pageCount > 1) {
                $pager.pager({ pagenumber: currentPage, pagecount: pageCount, buttonClickCallback: getPagedUser });
                $pager.fadeIn();
            }
        };

        // quy ước về hàm khởi tạo
        methods.init = function () {
            methods.buildJsTree();
            $("#roleTree").bind("reselect.jstree", function () {
                $("#roleTree").jstree('select_node', 'ul > li:first');
            });
            $('#add-new').live('click', addNew);
            $buttonSearch.live('click', search);
            getKeyValue();
        };
        return methods;
    })(VOFFICE.ManageUser);

    //gọi hàm khởi tạo
    VOFFICE.ManageUser.init();
});

window.AsignGrid = Backbone.View.extend({
    tagName: 'table',
    render: function () {
        $(this.el).html('');
        _.each(this.collection.models, function (userinrole) {
            $(this.el).append((new AsignRole({ model: userinrole })).render().el);
        }, this);
        return this;
    },

    /* 
    Khi grid có thêm bản ghi thì cập nhập
    */
    initialize: function () {
        var self = this;
        this.collection.bind("reset", this.render, this);
        this.collection.bind("add", function (userinrole) {
            $(self.el).prepend(new AsignRole({ model: userinrole }).render().el);
        });
    }
});

window.AsignRole = Backbone.View.extend({
    tagName: "tr",
    initialize: function () {
        this.model.bind("change", this.render, this);
        this.model.bind("destroy", this.unrender, this);
    },
    events: {
        'change .cbxIsInRole': 'assignRole'
    },
    assignRole: function (event) {
        var $target = $(event.currentTarget);
        var self = this;
        //luu du lieu
        SaveIndicator.indicate(self.model.save({ 'IsInRole': $target.is(':checked') }, function (data) {
            if (!data || data.Status == false) {
                alert("");
            }
        }));
    },
    render: function () {
        this.template = _.template($('#list-user-role').html());
        $(this.el).html(this.template({ model: this.model.toJSON() }));
        return this;
    },
    unrender: function () {
        this.remove();
        this.unbind();
        this.model.unbind("change", this.render, this);
    }
});
/*
View để thêm mới hay chỉnh sửa book (sổ công văn)
*/
window.UserForm = Backbone.View.extend({
    initialize: function () {
        //đưa sự kiện vào đây nếu đưa ở events thì ko validate được dữ  liệu
        //đang tìm nguyên nhân
        //$('#user-form').live('submit', this.submitUser);

        this.model.bind("change", this.render, this);
        this.model.bind("destroy", this.close, this);
    },
    /* 
    cập nhập hoặc thêm mới sổ văn bản 
    */
    submitUser: function (model) {
        //event.preventDefault();
        //bug fixes
        var self = VOFFICE.ManageUser.UserForm;
        if (!self) {
            VOFFICE.ManageUser.closeDialog();
        }
        var isNew = model.get('RoleName') == '';
        //tao moi hay cap nhap du lieu
        SaveIndicator.indicate(model.save({
            'UserName': $('#UserName').val(),
            'FullName': $('#FullName').val(),
            'Password': $('#Password').val(),
            'RoleName': $('#RoleName').val(),
            'Email': $('#Email').val(),
            'Gender': $('#Gender').is(':checked'),
            'Mobile': $('#Mobile').val(),
            'Address': $('#Address').val(),
            'IsApproved': $('#IsApproved').is(':checked')
        }, {
            success: function (data) {
                VOFFICE.ManageUser.updateGrid(model, isNew);
            },
            error: function (data) {
                VOFFICE.ManageUser.closeDialog();
            },
            complete: function () {
                self.close();
                return false;
            }
        }));
    },

    render: function () {
        var self = this;
        this.template = _.template($('#user-form-template').html());

        VOFFICE.ManageUser.dialog.html($(this.el).html(this.template({ model: this.model.toJSON() })));
        var isNew = this.model.get('UserId') == '';
        if (!isNew) {
            VOFFICE.ManageUser.dialog.dialog('option', 'title', jsResources.lang.ManageUserUpdateUserTitle);
            $('#user-form').validate(VOFFICE.ManageUser.CustomValidateUpdate);
            $(this.el).find('.hide-in-update').hide();
        } else {
            VOFFICE.ManageUser.dialog.dialog('option', 'title', jsResources.lang.ManageUserCreateUserTitle);
            $('#user-form').validate(VOFFICE.ManageUser.ValidateUpdate);
        }

        var dialogCloseButtons = jsResources.lang.ButtonClose;
        var dialogUpdateButtons = jsResources.lang.Update;
        var dialogButtons = {};
        dialogButtons[dialogUpdateButtons] = function () {
            //tao moi hay cap nhap du lieu
            SaveIndicator.indicate(self.model.save({
                'UserName': $('#UserName').val(),
                'FullName': $('#FullName').val(),
                'Password': $('#Password').val(),
                'RoleName': $('#RoleName').val(),
                'Email': $('#Email').val(),
                'Gender': $('#Gender').is(':checked'),
                'Mobile': $('#Mobile').val(),
                'Address': $('#Address').val(),
                'IsApproved': $('#IsApproved').is(':checked')
            }, {
                success: function (data) {
                    VOFFICE.ManageUser.updateGrid(self.model, isNew);
                },
                error: function (data) {
                    VOFFICE.ManageUser.closeDialog();
                },
                complete: function () {
                    //self.close();
                    return false;
                }
            }));
        };
        dialogButtons[dialogCloseButtons] = function () { $(this).dialog('close'); };
        VOFFICE.ManageUser.dialog.dialog(
            {
                buttons: dialogButtons
            }
        );

        VOFFICE.ManageUser.dialog.dialog('open');
        return this;
    },

    close: function () {
        this.remove();
        this.unbind();
        this.model.unbind("change", this.render, this);
    }
});
/*
Chứa một collection là list các book model
gọi đến BookGridItem để hiển thị dữ liệu
*/
window.UserGrid = Backbone.View.extend({
    tagName: 'tbody',
    render: function () {
        $(this.el).html('');
        var i = 1;
        _.each(this.collection.models, function (book) {
            book.set({ 'Order': i });
            $(this.el).append((new UserGridItem({ model: book })).render().el);
            i++;
        }, this);
        return this;
    },

    /* 
    Khi grid có thêm bản ghi thì cập nhập
    */
    initialize: function () {
        var self = this;
        this.collection.bind("reset", this.render, this);
        this.collection.bind("add", function (book) {
            $(self.el).prepend(new UserGridItem({ model: book }).render().el);
        });
    }
});

/*
từng item trong grid dữ liệu
các item này tạo thành table chứa thông tin tất cả các book có trong hệ thống
*/
window.UserGridItem = Backbone.View.extend({
    tagName: 'tr',

    //bind để tự động cập nhập lại dữ liệu khi các field của model thay đổi
    initialize: function () {
        this.model.bind("change", this.render, this);
        this.model.bind("destroy", this.close, this);
    },
    /*
    Các sự kiện trên một dòng trong grid 
    */
    events: {
        'click .grid-user-role': 'showRoles',
        'click .grid-update-user': 'showUpdate',
        'click .grid-delete-user': 'deleteUser',
        'change .cbxIsApproved': 'activeUser'
    },

    /* Xem danh sach vai tro */

    showRoles: function (event) {
        VOFFICE.ManageUser.assignrole(this.model);
    },
    /*
    Active hay InActive sổ văn bản
    */
    activeUser: function (event) {
        var $target = $(event.currentTarget);
        var self = this;
        //luu du lieu
        SaveIndicator.indicate(self.model.save({ 'IsApproved': $target.is(':checked'), 'modifyscope': 'IsApproved' }, function (data) {
            if (!data || data.Status == false) {
                alert("");
            }
        }));
    },
    /*
    Xóa sổ văn bản
    */
    deleteUser: function (event) {
        var self = this;
        VH.ConfirmBox(jsResources.ManageUserDeleteConfirm(self.model.get('UserName')), jsResources.lang.Delete, jsResources.lang.Cancel,
            function () {
                //xoa du lieu
                SaveIndicator.indicate($.post('/users/delete_user', { id: self.model.get('UserName'), nocache: (new Date()).toJSON() }, function (data) {
                    if (!!data && data.Status == true) {
                        self.close();
                    } else {
                        alert("");
                    }
                }));
            },
            function () {
                return true;
            }, jsResources.lang.ManageUserDeleteTitle
        );
    },

    /*
    Hiển thị màn hình để cập nhập sổ văn bản
    */
    showUpdate: function (event) {
        VOFFICE.ManageUser.edit(this.model);
    },

    /*
    Kết hợp template và model để hiển thị lên 1 dòng (tr)
    chứa thông tin của 1 sổ văn bản trong grid
    */
    render: function () {
        this.template = _.template($('#list-user-item-template').html());
        $(this.el).html(this.template({ model: this.model.toJSON() }));
        return this;
    },

    close: function () {
        $(this.el).remove();
    }
});